From 46c4869945009d1e8882b64a5d89dfc336a55af9 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 29 Nov 2017 20:05:02 +0100 Subject: [PATCH] broadway: Prepare for implementing diff --- gdk/broadway/broadway-output.c | 38 ++++++++++++++++++++-------------- gdk/broadway/broadway-output.h | 3 ++- gdk/broadway/broadway-server.c | 10 ++++----- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/gdk/broadway/broadway-output.c b/gdk/broadway/broadway-output.c index e679923f37..9389de44ce 100644 --- a/gdk/broadway/broadway-output.c +++ b/gdk/broadway/broadway-output.c @@ -154,6 +154,19 @@ append_uint32 (BroadwayOutput *output, guint32 v) buf[3] = (v >> 24) & 0xff; } +static void +patch_uint32 (BroadwayOutput *output, guint32 v, gsize offset) +{ + guint8 *buf; + + buf = (guint8 *)output->buf->str + offset; + buf[0] = (v >> 0) & 0xff; + buf[1] = (v >> 8) & 0xff; + buf[2] = (v >> 16) & 0xff; + buf[3] = (v >> 24) & 0xff; +} + + static void write_header(BroadwayOutput *output, char op) { @@ -309,29 +322,24 @@ append_node (BroadwayOutput *output, append_node (output, node->children[i]); } -guint32 -get_node_size (BroadwayNode *node) -{ - guint32 size = 1 + node->n_data; - guint32 i; - - for (i = 0; i < node->n_children; i++) - size += get_node_size (node->children[i]); - - return size; -} - - void broadway_output_window_set_nodes (BroadwayOutput *output, int id, - BroadwayNode *root) + BroadwayNode *root, + BroadwayNode *old_root) { + gsize size_pos, start, end; write_header (output, BROADWAY_OP_SET_NODES); append_uint16 (output, id); - append_uint32 (output, get_node_size (root)); + + size_pos = output->buf->len; + append_uint32 (output, 0); + + start = output->buf->len; append_node (output, root); + end = output->buf->len; + patch_uint32 (output, (end - start) / 4, size_pos); } void diff --git a/gdk/broadway/broadway-output.h b/gdk/broadway/broadway-output.h index db1ba944d8..4f18b6e882 100644 --- a/gdk/broadway/broadway-output.h +++ b/gdk/broadway/broadway-output.h @@ -59,7 +59,8 @@ void broadway_output_set_transient_for (BroadwayOutput *output, int parent_id); void broadway_output_window_set_nodes (BroadwayOutput *output, int id, - BroadwayNode *root); + BroadwayNode *root, + BroadwayNode *old_root); void broadway_output_upload_texture (BroadwayOutput *output, guint32 id, GBytes *texture); diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c index a6b311415c..3cbd214d34 100644 --- a/gdk/broadway/broadway-server.c +++ b/gdk/broadway/broadway-server.c @@ -1635,13 +1635,13 @@ broadway_server_window_set_nodes (BroadwayServer *server, if (window == NULL) return; + if (server->output != NULL) + broadway_output_window_set_nodes (server->output, window->id, + root, window->nodes); + if (window->nodes) broadway_node_free (window->nodes); window->nodes = root; - - if (server->output != NULL) - broadway_output_window_set_nodes (server->output, window->id, - window->nodes); } guint32 @@ -1888,7 +1888,7 @@ broadway_server_resync_windows (BroadwayServer *server) if (window->nodes) broadway_output_window_set_nodes (server->output, window->id, - window->nodes); + window->nodes, NULL); if (window->visible) broadway_output_show_surface (server->output, window->id); -- 2.30.2